// Loesung_von_Aufgabe_9.8_5_Zerfall_des_Neutrons_01

PVector B = new PVector(0, 0, -120); // magnetische Flussdichte

// Ortsvektoren
PVector rNeutron = new PVector(0, 0, 0);
PVector rProton = new PVector(100, 0, 0); 
PVector rElektron = new PVector(100, 0, 0);

// Geschwindigkeitsvektoren
PVector vNeutron = new PVector(1000, 0, 0);
PVector vProton = new PVector(1000, 0, 0);
PVector vElektron = new PVector(1000, 0, 0);

// Ladungen
float qNeutron = 0;
float qProton = 1;
float qElektron = -1; 

// Massen
float mNeutron = 1838.7; 
float mProton = 1836.1;
float mElektron = 1;

float t = 0.0001; // Sehr kleiner Zeitschritt um eine höhere Genauigkeit zu erreichen

void setup()
{
  frameRate(1000); // Wegen der kleinen Zeitschritte wählen wir eine hohe Bildwiederholungsrate
  size(800, 200);
  background(200);

  stroke(0);
  strokeWeight(1);
  line(0, 100, 800, 100);

  // Zeichen für das B-Feld
  noFill();
  stroke(0);
  strokeWeight(3);
  ellipse(50, 50, 30, 30);
  line(38.5, 40, 62.5, 60);
  line(38.5, 60, 62.5, 40);
  fill(0);
  textSize(32);
  text("B", 75, 60);

  // Erläuterung zu den Linien
  stroke(255);
  strokeWeight(5);
  line(200, 40, 240, 40);
  fill(255);
  textSize(24);
  text("Neutron", 250, 50);

  stroke(255);
  strokeWeight(5);
  line(200, 40, 240, 40);
  fill(255);
  textSize(24);
  text("Neutron", 250, 50);

  stroke(0, 0, 255);
  strokeWeight(5);
  line(400, 40, 440, 40);
  fill(0, 0, 255);
  textSize(24);
  text("Elektron", 450, 50);

  stroke(255, 0, 0);
  strokeWeight(5);
  line(600, 40, 640, 40);
  fill(255, 0, 0);
  textSize(24);
  text("Proton", 650, 50);
}

void draw()
{
  translate(0, 100); // Verschiebung des Koordinatenursprungs

  // vektorielle Berechnung der Bahn des Neutrons
  rNeutron.add(PVector.mult(vNeutron, t));
  noStroke();
  fill(255);
  ellipse(rNeutron.x, rNeutron.y, 5, 5);

  if (rNeutron.x >= 100)
  {
    rNeutron.x = 101;

    // vektorielle Berechnung der Bahn des Protons
    PVector fProton = PVector.mult((B.cross(vProton)), qProton);
    PVector aProton = PVector.div(fProton, mProton);
    vProton.add(PVector.mult(aProton, t));
    rProton.add(PVector.mult(vProton, t));
    noStroke();
    fill(255, 0, 0);
    ellipse(rProton.x, rProton.y, 5, 5);

    // vektorielle Berechnung der Bahn des Elektrons
    PVector fElektron = PVector.mult((B.cross(vElektron)), qElektron);
    PVector aElektron = PVector.div(fElektron, mElektron);
    vElektron.add(PVector.mult(aElektron, t));
    rElektron.add(PVector.mult(vElektron, t));
    noStroke();
    fill(0, 0, 255);
    ellipse(rElektron.x, rElektron.y, 3, 3);

    // zurücksetzen auf die Startwerte des Elektrons
    if (rElektron.x >= 110)
    {
      rElektron = new PVector(100, 0, 0);
      vElektron = new PVector(1000, 0, 0);
    }
  }
  if (rProton.x >= 800) // Wenn nur eine Programmzeile nach der if-Bedingung folgt, dann kann man auf die geschweiften Klammern verzichten
    noLoop();
}